<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 点击按钮弹出警告：你别点我 -->
    <input type="button" value="点击" onclick="(function(){alert('你别点我');})()">

    <script>
        //函数表达式：把函数当作一个值赋给一个变量；
        //注意：函数表达式必须先调用，在声明；
        let f1 = function fun(){
            console.log('hello f1!');
        };
        //函数调用：变量名（）调用；
        f1();
        
        let f2 = function fun2(name){
            console.log('hello'+name);
        }
        f2('张三！');
        //匿名函数：函数没有名字；                                   
        let f3 = function(a,b){
            return a<b?a:b;
        };
        console.log(f3(23,11));
        //立即执行函数：匿名函数自调用，用（）括起来的一部分是一个整体；
        (function(a,b){
            console.log(a+b);
        })(1,2);

        let a = function(){
            console.log(1);
        };

        console.log(typeof a);//函数数据类型：属于object，和数组一样
        //吧函数这个值作为实参传给另一个函数
        //回调函数：把函数A当作参数传给函数B，在函数B中调用函数A，此时函数A叫做j回调函数
        console.log('----------------');
        let myf1 = function(a){
            a();  //myf2();
        };
        let myf2 = function(){
            console.log('myf2');
        };
        myf1(myf2);

        console.log('------------------');
        /* 
        function test(a,b){
             let nc = a+b;
        }
        function test2(){
            return 0;
        }
        console.log(test());
        console.log(test2());
        */
        console.log('------------------');

        //递归函数：在函数中调用自己；
        //阶乘：10！=10*9*8*7*6....*1 > 10*(9!) > 10*9*(8!) > 10*9*8*(7!)
        let jc = function(n){
            if(n===1){
                return 1;
            }else{
                return n*jc(n-1);
            }
        }
        console.log(jc(10));

        console.log('------------------');


    </script>
</body>
</html>